package test.IOTest.网络爬虫;

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class demo1 {
	public static void main(String[] args) throws IOException {
		/*
		姓氏：https://hanyu.baidu.com/shici/detail?from=aladdin&pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&smp_names=termBrand2
		男生姓名：http://www.haoming8.cn/baobao/10881.html
		女生姓名：http://www.haoming8.cn/baobao/7641.html
		 */
		
		// 	1.定义变量记录网址
		String familyNameNet = "https://hanyu.baidu.com/shici/detail?from=aladdin&pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&smp_names=termBrand2";
		String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";
		String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";
		// 	2.爬出数据，把网址上所有的数据拼接成一个字符串
		String familyStr = webCrawle(familyNameNet);
		String boyNameStr = webCrawle(boyNameNet);
		String girlNameStr = webCrawle(girlNameNet);
		
		// 	3.通过正则表达式来获取数据
		// 	姓
		ArrayList<String> familyData = new ArrayList<>();
		ArrayList<String> data = getData(familyStr, ".{4}，.{4}。", 0);
		for (String str : data) {
			String[] strs = str.substring(0, str.length() - 1).split("，");
			for (String s : strs) {
				for (char c : s.toCharArray()) {
					familyData.add(c + "");
				}
			}
		}
		// 	男名
		ArrayList<String> boyData = getData(boyNameStr, "([\\u4E00-\\u9FA5]{2})(、|。)", 1);
		// // 女名
		ArrayList<String> girlData = new ArrayList<>();
		ArrayList<String> girlDataDel = getData(girlNameStr, "(.. ){4}..", 0);
		for (String str : girlDataDel) {
			Collections.addAll(girlData, str.split(" "));
		}
		
		// 	4.生成数据
		
		
		for (int i = 0; i < 30; i++) {
			System.out.println(familyData.get(i) + boyData.get(i));
			System.out.println(familyData.get(i) + girlData.get(i));
			
		}
		
		
	}
	
	/*
	作用：从网络中爬取数据，把数据拼接成字符串返回
	形参：网址
	返回值：爬取到的所有数据
	 */
	public static String webCrawle(String net) throws IOException {
		// 	1.定义StringBuilder拼接爬取到的数据
		StringBuilder sb = new StringBuilder();
		// 	2.创建一个URL对象
		URL url = new URL(net);
		// 	3.连接上这个网址
		URLConnection conn = url.openConnection();
		// 	4.读取数据(获取输入流,因为会有中文所以把字节流转换为字符流)
		InputStreamReader isr = new InputStreamReader(conn.getInputStream());
		int ch;
		while ((ch = isr.read()) != -1) {
			sb.append((char) ch);
		}
		// 5.释放资源
		isr.close();
		// 6.返回读取的数据
		return sb.toString();
	}
	
	/*
	作用：根据正则表达式获取字符串中的数据
	参数一：完整的字符串
	参数二：正则表达式
	参数三：获取第几组数据()包裹分割组别
	 */
	private static ArrayList<String> getData(String str, String regex, Integer index) {
		// 	1.创建集合存储数据
		ArrayList<String> list = new ArrayList<>();
		// 	2.按照正则表达式获取数据，
		//正则表达式对象
		Pattern p = Pattern.compile(regex);
		//按照正则规则获取数据
		Matcher m = p.matcher(str);
		while (m.find()) {
			// 把满足要求的数据获取
			list.add(m.group(index));
			// System.out.println(m.group(index));
		}
		return list;
	}
	
	
}
